﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraCharts;
using System.Data.SqlClient;
using Lists;
using GeneralLibs;

namespace BI
{
    public partial class UcDashBoardDetail : UserControl
    {
        private static int _NumberOfReIndex = 0;

        public UcDashBoardDetail()
        {
            InitializeComponent();
        }

        private void UcDashBoardDetail_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;

            Lists.Store store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);

            if (!store.Ten.ToUpper().Contains("BACHKHOA"))
                btnSuDungBIcu.Visible = false;
            else btnSuDungBIcu.Visible = true;

            DateTime now = GeneralLibs.CommonLib.GetSystemDateTime();
            dtNgayKetThuc.DateTime = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
            numInterval.Value = 7;
            cmbKyBaoCao.SelectedIndex = 17;
            cmbKyBaoCao.SelectedIndex = 18;

            ucDigitalNumberTienMat.gaugeControl1.Tag = string.Format("Lượng tiền mặt còn thực tế tại doanh nghiệp\r\nđến thời điểm {0}(Số dư 1111)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberTienGuiNganHang.gaugeControl1.Tag = string.Format("Lượng tiền gửi còn trong tài khoản ngân hàng của doanh nghiệp\r\nđến thời điểm {0} (Số dư 1121)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberHangHoa.gaugeControl1.Tag = string.Format("Tổng giá vốn của hàng hóa trong các kho của doanh nghiệp\r\nđến thời điểm {0} (Số dư 1561)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberDoanhSoBanBuon.gaugeControl1.Tag = "Tổng số tiền các hóa đơn bán buôn (bao gồm tiền thuế VAT)";
            ucDigitalNumberPhaiThu.gaugeControl1.Tag = string.Format("Tổng công nợ phải thu của doanh nghiệp đến thời điểm {0}(Số dư 131)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberPhaiTra.gaugeControl1.Tag = string.Format("Tổng công nợ phải trả của doanh nghiệp đến thời điểm {0}(Số dư 331)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberLaiGop.gaugeControl1.Tag = string.Format("Lãi từ bán hàng trong kỳ được chọn (doanh số bán hàng cả thuế - giá vốn)");
            ucDigitalNumberTongThu.gaugeControl1.Tag = string.Format("Tổng số tiền đã được doanh nghiệp thu vào (Nợ 1111 và 1121)");
            ucDigitalNumberTongChi.gaugeControl1.Tag = string.Format("Tổng số tiền đã được doanh nghiệp chi ra (Có 1111 và 1121)");
            //ucDigitalNumberLoiNhuanTruocThue.gaugeControl1.Tag = string.Format("Tổng lợi nhuận trước thuế. Bao gồm:\r\nlãi trước thuế, lãi từ hoạt động tài chính, lãi từ hoạt động khác");
            ucDigitalNumberLaiTruChiPhi.gaugeControl1.Tag = string.Format("Số tiền lãi sau khi trừ các chi phí hoạt động và sản xuất\r\n(Lãi gộp + thu khác (515, 711)- tổng chi (641, 642, 334, 213, 811, 635)");
            ucDigitalNumberLoiNhuanThuc.gaugeControl1.Tag = string.Format("Số tiền lợi nhuận từ tổng các loại tiền lãi\r\ntrừ các chi phí hoạt động sản xuất (641, 642, 334, 213) và thuế (821, 333)");
            ucDigitalNumberThueThuNhap.gaugeControl1.Tag = string.Format("Số tiền phải trả thuế cho nhà nước trong kỳ được chọn (Phát sinh 821, 333)");
            ucDigitalNumberNguonVon.gaugeControl1.Tag = string.Format("Nguồn vốn còn lại tại doanh nghiệp đến thời điểm {0}(Số dư 411)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
            ucDigitalNumberTongChiPhiHoatDong.gaugeControl1.Tag = string.Format("Số tiền đã chi cho hoạt động doanh nghiệp (Phát sinh 641+642,334)");
            ucDigitalNumberChiPhiSanXuat.gaugeControl1.Tag = string.Format("Số tiền doang nghiệp đã chi cho sản xuất hàng hóa (Phát sinh 213)");
            ucDigitalNumberDoanhSoBanLe.gaugeControl1.Tag = string.Format("Tổng số tiền các hóa đơn bán lẻ (bao gồm tiền thuế VAT)");
            ucDigitalNumberThuKhac.gaugeControl1.Tag = string.Format("Số tiền được doanh nghiệp thu vào từ tài khoản thu khác (Phát sinh 711, 515)");
            ucDigitalNumberThuNguonVon.gaugeControl1.Tag = string.Format("Số tiền dạng nguồn vốn huy động được trong kỳ (Phát sinh 411)");
            ucDigitalNumberThuBanHang.gaugeControl1.Tag = string.Format("Số tiền doanh nghiệp thu được từ bán hàng");
            ucDigitalNumberChiMuaHang.gaugeControl1.Tag = string.Format("Số tiền đã được doanh nghiệp chi ra để mua hàng");
            ucDigitalNumberChiKhac.gaugeControl1.Tag = string.Format("Số tiền đã được doanh nghiệp chi cho các hoạt động khác (Có 1111,1121 và Nợ 811,635)");
            ucDigitalNumberChiNguonVon411.gaugeControl1.Tag = string.Format("Số tiền chi ra từ tài khoản nguồn vốn (Có 1111 Nợ 411)", CommonLib.DateTimeVNToString(dtNgayKetThuc.DateTime));
        }

        private void cmbKyBaoCao_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                DateTime ngayBatDau = dtNgayBatDau.DateTime;
                DateTime ngayKetThuc = dtNgayBatDau.DateTime;
                DateTime now = GeneralLibs.CommonLib.GetSystemDateTime();
                switch (cmbKyBaoCao.Text)
                {
                    case "Hôm nay":
                        dtNgayBatDau.Enabled = true;
                        dtNgayKetThuc.Enabled = true;
                        ngayBatDau = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
                        ngayKetThuc = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
                        break;
                    case "Hôm qua":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).AddDays(-1);
                        ngayKetThuc = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59).AddDays(-1);
                        break;
                    case "Tuần gần nhất":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0).AddDays(-7);
                        ngayKetThuc = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
                        break;
                    case "Tháng này":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
                        ngayKetThuc = new DateTime(now.Year, now.Month, System.DateTime.DaysInMonth(now.Year, now.Month), 23, 59, 59);
                        break;
                    case "Tùy chọn":
                        dtNgayBatDau.Enabled = true;
                        dtNgayKetThuc.Enabled = true;
                        ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemKhoaSoGanNhat(DateTime.Now);
                        ngayBatDau = thoiDiemKhoaSoGanNhat.ThoiDiem;
                        ngayKetThuc = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59);
                        break;
                    case "Cả năm":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 1, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 12, 31, 23, 59, 59);
                        break;
                    case "Quý I":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 1, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 3, 31, 23, 59, 59);
                        break;
                    case "Quý II":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 4, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 6, 30, 23, 59, 59);
                        break;
                    case "Quý III":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 7, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 9, 30, 23, 59, 59);
                        break;
                    case "Quý IV":
                        dtNgayBatDau.Enabled = false;
                        dtNgayKetThuc.Enabled = false;
                        ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, 10, 1);
                        ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, 12, 31, 23, 59, 59);
                        break;
                    default:
                        try
                        {
                            dtNgayBatDau.Enabled = false;
                            dtNgayKetThuc.Enabled = false;
                            string strThang = ((string)cmbKyBaoCao.SelectedItem).Substring(((string)(cmbKyBaoCao.SelectedItem)).LastIndexOf(" "));
                            int thang = int.Parse(strThang);

                            ngayBatDau = new DateTime(GeneralLibs.Config.NamTaiChinh, thang, 1);
                            ngayKetThuc = new DateTime(GeneralLibs.Config.NamTaiChinh, thang,
                                            DateTime.DaysInMonth(GeneralLibs.Config.NamTaiChinh, thang), 23, 59, 59);
                        }
                        catch (SqlException sqlEx)
                        {
                            throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                        }
                        catch (Exception ex)
                        {
                            if (ex is CustomException) throw ex;
                            else
                            {
                                throw new Exception(ex.Message);
                            }
                        }
                        break;
                }
                dtNgayBatDau.DateTime = ngayBatDau;
                dtNgayKetThuc.DateTime = ngayKetThuc;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            //Kiểm tra xem nếu xem từ đầu kỳ cuối thì phải tính cả tồn đầu kỳ còn các trường hợp khác thì chỉ tính phát sinh.
            bool xemTuDauKyCuoi = false;
            ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemKhoaSoGanNhat(DateTime.Now);
            if (thoiDiemKhoaSoGanNhat.ThoiDiem == dtNgayBatDau.DateTime)
                xemTuDauKyCuoi = true;

            BasicForms.FrmProgressBar.StartShowProgress();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandText = "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED";
                cmd.ExecuteNonQuery();

                DateTime dtPointer = dtNgayBatDau.DateTime;
                Guid taiKhoanLai = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("DoanhThuBanHangVaCungCapDichVu");

                Guid taiKhoanTienMatID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("TienMat");
                SoDuTaiKhoan soDuTaiKhoanTienMat = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanTienMatID);
                ucDigitalNumberTienMat.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanTienMat.DuNo);

                Guid taiKhoanTienGuiNganHangID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("TienGuiNganHang");
                SoDuTaiKhoan soDuTaiKhoanTienGuiNganHang = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanTienGuiNganHangID);
                ucDigitalNumberTienGuiNganHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanTienGuiNganHang.DuNo);

                Guid taiKhoanHangHoaID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("GiaMuaHangHoa");
                SoDuTaiKhoan soDuTaiKhoanHangHoa = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanHangHoaID);
                if (soDuTaiKhoanHangHoa.DuCo > 0)
                    MessageBox.Show("Cần kiểm tra lại số dư tài khoản hàng hóa. Hiện tại đang âm " + soDuTaiKhoanHangHoa.DuCo.ToString());
                ucDigitalNumberHangHoa.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanHangHoa.DuNo);

                Guid taiKhoanNoPhaiThuID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("PhaiThuKhachHang");
                SoDuTaiKhoan soDuTaiKhoanNoPhaiThu = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanNoPhaiThuID);
                ucDigitalNumberPhaiThu.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanNoPhaiThu.DuNo);

                Guid taiKhoanNoPhaiTraID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("PhaiTraNhaCungCap");
                SoDuTaiKhoan soDuTaiKhoanNoPhaiTra = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanNoPhaiTraID);
                ucDigitalNumberPhaiTra.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanNoPhaiTra.DuCo);

                Guid taiKhoanDoanhThuID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("DoanhThuBanHangVaCungCapDichVu");
                //ucDigitalNumberDoanhSo.DisplayText = GeneralLibs.CommonLib.Decimal2Money(TaiKhoan.TinhSoPhatSinhCo(cmd, taiKhoanDoanhThuID, dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime));
 
                decimal tongThu = NhatKyThuChi.TongThu(cmd, dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime);
                decimal tongChi = NhatKyThuChi.TongChi(cmd, dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime);
                ucDigitalNumberTongThu.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongThu);
                ucDigitalNumberTongChi.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongChi);

                //Chia thu làm 3 loại
                //Nguồn vốn 411
                DanhMucTaiKhoan dmTKNguonVon411 = DanhMucTaiKhoan.Filter("SoHieu = '411'");
                decimal tongThuNguonVon411 = NhatKyThuChi.TongThuTheoTaiKhoanDoiUng(cmd, dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, dmTKNguonVon411);
                ucDigitalNumberThuNguonVon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongThuNguonVon411);
                //Thu khác 711
                DanhMucTaiKhoan dmTKThuKhac711_515 = DanhMucTaiKhoan.Filter("SoHieu IN ('711','515')");
                decimal tongThuKhac711_515 = NhatKyThuChi.TongThuTheoTaiKhoanDoiUng(cmd, dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, dmTKThuKhac711_515);
                ucDigitalNumberThuKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongThuKhac711_515);
                //Thu bán hàng: các thu còn lại
                decimal tongThuBanHang = tongThu - tongThuNguonVon411 - tongThuKhac711_515;
                ucDigitalNumberThuBanHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongThuBanHang);

                //Chi chia làm 5 loại.
                //Chi khác 811, 635
                DanhMucTaiKhoan dmTKChiKhac811_635 = DanhMucTaiKhoan.Filter("SoHieu IN ('811','635')");
                decimal tongChiKhac811_635 = NhatKyThuChi.TongChiTheoTaiKhoanDoiUng(cmd, dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, dmTKChiKhac811_635);
                ucDigitalNumberChiKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongChiKhac811_635);
                //Chi phí hoạt động và sản xuất 641 . 642
                Guid taiKhoanChiPhiBanHangID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("641").ID;
                Guid taiKhoanChiPhiQuanLyID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("642").ID;
                Guid taiKhoanLuongID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("334").ID;
                SoDuTaiKhoan soDuTaiKhoanChiPhiBanHang = new SoDuTaiKhoan();
                SoDuTaiKhoan soDuTaiKhoanChiPhiQuanLy = new SoDuTaiKhoan();
                SoDuTaiKhoan soDuTaiKhoanLuong = new SoDuTaiKhoan();
                if (xemTuDauKyCuoi)
                {
                    soDuTaiKhoanChiPhiBanHang = SoDuTaiKhoan.CalculateFromDB( dtNgayKetThuc.DateTime, taiKhoanChiPhiBanHangID);
                    soDuTaiKhoanChiPhiQuanLy = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanChiPhiQuanLyID);
                    soDuTaiKhoanLuong = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanLuongID);
                }
                else
                {
                    soDuTaiKhoanChiPhiBanHang = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanChiPhiBanHangID);
                    soDuTaiKhoanChiPhiQuanLy = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanChiPhiQuanLyID);
                    soDuTaiKhoanLuong = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanLuongID);
                }

                decimal chiPhiHoatDong = soDuTaiKhoanChiPhiBanHang.DuNo + soDuTaiKhoanChiPhiQuanLy.DuNo + soDuTaiKhoanLuong.DuNo;
                ucDigitalNumberTongChiPhiHoatDong.DisplayText = GeneralLibs.CommonLib.Decimal2Money(chiPhiHoatDong);

                Guid taiKhoanChiPhiSXID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("213").ID;
                SoDuTaiKhoan soDuTaiKhoanChiPhiSX = new SoDuTaiKhoan();
                if (xemTuDauKyCuoi)
                {
                    soDuTaiKhoanChiPhiSX = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanChiPhiSXID);
                }
                else
                {
                    soDuTaiKhoanChiPhiSX = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanChiPhiSXID);
                }

                ucDigitalNumberChiPhiSanXuat.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanChiPhiSX.DuNo);
                //Chi nguồn vốn 411
                //Nguồn vốn 411
                DanhMucTaiKhoan dmTKChiNguonVon411 = DanhMucTaiKhoan.Filter("SoHieu = '411'");
                decimal tongChiNguonVon411 = NhatKyThuChi.TongChiTheoTaiKhoanDoiUng(cmd, dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, dmTKChiNguonVon411);
                ucDigitalNumberChiNguonVon411.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongChiNguonVon411);

                //Chi phí còn lại là chi phí mua hàng
                decimal tongChiPhiMuaHang = tongChi - tongChiKhac811_635 - soDuTaiKhoanChiPhiBanHang.DuNo - soDuTaiKhoanChiPhiQuanLy.DuNo;
                ucDigitalNumberChiMuaHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money(tongChiPhiMuaHang);

                
                decimal laiGop = 0;
                #region tinh lai gop trong ky
                //Tính lãi
                cmd.CommandText = "SELECT SUM(Value7) AS DoanhSoBan, SUM(Value7 - Value3) AS Lai\n" +
                                        "FROM KhoanMucChungTu \n" +
                                        "WHERE ChungTuID IN (SELECT ChungTuID FROM ChungTu  \n" +
                                        "					WHERE ChungTuGocID IN (SELECT ChungTuID \n" +
                                        "											FROM ChungTu \n" +
                                        "											WHERE LoaiChungTuID IN (SELECT ID FROM LoaiChungTu \n" +
                                        "																	WHERE Ma IN (N'HoaDonBanHang', N'HoaDonBanLe') \n" +
                                        "																	) \n" +
                                        "                                                    AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1\n" +
                                        "											)\n" +
                                        "                   )\n" +
                                        " AND Value5 IS NOT NULL AND Value3 IS NOT NULL ";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", dtNgayBatDau.DateTime);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", dtNgayKetThuc.DateTime);

                ucDigitalNumberLaiGop.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["Lai"] != DBNull.Value)
                        {
                            laiGop = (decimal)dr["Lai"];
                            ucDigitalNumberLaiGop.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["Lai"]);
                            //ucDigitalNumberDoanhSoBanBuon.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoBan"]);
                        }
                    }
                    catch
                    {
                    }
                }
                dr.Close();

                //tách doanh số bán buôn và bán lẻ
                //bán buôn
                cmd.CommandText = "SELECT SUM(Value7) AS DoanhSoBanBuon\n" +
                                      "FROM KhoanMucChungTu \n" +
                                      "WHERE ChungTuID IN (SELECT ChungTuID FROM ChungTu  \n" +
                                      "					WHERE ChungTuGocID IN (SELECT ChungTuID \n" +
                                      "											FROM ChungTu \n" +
                                      "											WHERE LoaiChungTuID IN (SELECT ID FROM LoaiChungTu \n" +
                                      "																	WHERE Ma IN (N'HoaDonBanHang') \n" +
                                      "																	) \n" +
                                      "                                                    AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1\n" +
                                      "											)\n" +
                                      "                   )\n" +
                                      " AND Value5 IS NOT NULL AND Value3 IS NOT NULL ";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", dtNgayBatDau.DateTime);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", dtNgayKetThuc.DateTime);

                ucDigitalNumberDoanhSoBanBuon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoBanBuon"] != DBNull.Value)
                        {
                            ucDigitalNumberDoanhSoBanBuon.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoBanBuon"]);
                        }
                    }
                    catch
                    {
                    }
                }
                dr.Close();

                //bán buôn
                cmd.CommandText = "SELECT SUM(Value7) AS DoanhSoBanLe\n" +
                                      "FROM KhoanMucChungTu \n" +
                                      "WHERE ChungTuID IN (SELECT ChungTuID FROM ChungTu  \n" +
                                      "					WHERE ChungTuGocID IN (SELECT ChungTuID \n" +
                                      "											FROM ChungTu \n" +
                                      "											WHERE LoaiChungTuID IN (SELECT ID FROM LoaiChungTu \n" +
                                      "																	WHERE Ma IN (N'HoaDonBanLe') \n" +
                                      "																	) \n" +
                                      "                                                    AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1\n" +
                                      "											)\n" +
                                      "                   )\n" +
                                      " AND Value5 IS NOT NULL AND Value3 IS NOT NULL ";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("ThoiDiemDau", dtNgayBatDau.DateTime);
                cmd.Parameters.AddWithValue("ThoiDiemCuoi", dtNgayKetThuc.DateTime);

                ucDigitalNumberDoanhSoBanLe.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    try
                    {
                        if (dr["DoanhSoBanLe"] != DBNull.Value)
                        {
                            ucDigitalNumberDoanhSoBanLe.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoBanLe"]);
                        }
                    }
                    catch
                    {
                    }
                }
                dr.Close();
                #endregion

                #region tinh doanh so mua hang
                //cmd.CommandText = "SELECT SUM(SotienNT) DoanhSoMuaHang\n" +
                //                    "FROM ChungTu  \n" +
                //                    "WHERE LoaiChungTuID = (SELECT ID FROM LoaiChungTu  \n" +
                //                    "						WHERE Ma = N'HoaDonMuaHang' \n" +
                //                    "						)         \n" +
                //                    "       AND SoTienNT IS NOT NULL AND @ThoiDiemDau <= Ngay AND Ngay <= @ThoiDiemCuoi AND GhiSo = 1";
                //cmd.Parameters.Clear();
                //cmd.Parameters.AddWithValue("ThoiDiemDau", dtNgayBatDau.DateTime);
                //cmd.Parameters.AddWithValue("ThoiDiemCuoi", dtNgayKetThuc.DateTime);
                //dr = cmd.ExecuteReader();

                //ucDigitalNumberMuaHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money(0);//default value
                //if (dr.Read())
                //{
                //    try
                //    {
                //        if (dr["DoanhSoMuaHang"] != DBNull.Value)
                //            ucDigitalNumberMuaHang.DisplayText = GeneralLibs.CommonLib.Decimal2Money((decimal)dr["DoanhSoMuaHang"]);
                //    }
                //    catch
                //    {
                //    }
                //}
                //dr.Close();
                #endregion

                ////Lãi hoạt động tài chính - Huy hoàng lại bảo k dùng
                //Guid taiKhoanDoanhThuHoatDongTaiChinhID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("515").ID;
                //Guid taiKhoanChiPhiHoatDongTaiChinhID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("635").ID;
                //SoDuTaiKhoan soDuTaiKhoanDoanhThuHoatDongTaiChinh = new SoDuTaiKhoan();
                //SoDuTaiKhoan soDuTaiKhoanChiPhiHoatDongTaiChinh = new SoDuTaiKhoan();
                //if (xemTuDauKyCuoi)
                //{
                //    soDuTaiKhoanDoanhThuHoatDongTaiChinh = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanDoanhThuHoatDongTaiChinhID);
                //    soDuTaiKhoanChiPhiHoatDongTaiChinh = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanChiPhiHoatDongTaiChinhID);
                //}
                //else
                //{
                //    soDuTaiKhoanDoanhThuHoatDongTaiChinh = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanDoanhThuHoatDongTaiChinhID);
                //    soDuTaiKhoanChiPhiHoatDongTaiChinh = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanChiPhiHoatDongTaiChinhID);
                //}
                //decimal laiHoatDongTaiChinh = soDuTaiKhoanDoanhThuHoatDongTaiChinh.DuCo - soDuTaiKhoanChiPhiHoatDongTaiChinh.DuNo;
                //ucDigitalNumberLaiHoatDongTC.DisplayText = GeneralLibs.CommonLib.Decimal2Money(laiHoatDongTaiChinh);

                ////Lãi từ hoạt động khác - Huy hoàng lại bảo k dùng
                //Guid taiKhoanDoanhThuKhacID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("711").ID;
                //Guid taiKhoanChiPhiKhacID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("811").ID;
                //SoDuTaiKhoan soDuTaiKhoanDoanhThuKhac = new SoDuTaiKhoan();
                //SoDuTaiKhoan soDuTaiKhoanChiPhiKhac = new SoDuTaiKhoan();
                //if (xemTuDauKyCuoi)
                //{
                //    soDuTaiKhoanDoanhThuKhac = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanDoanhThuKhacID);
                //    soDuTaiKhoanChiPhiKhac = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanChiPhiKhacID);
                //}
                //else
                //{
                //    soDuTaiKhoanDoanhThuKhac = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanDoanhThuKhacID);
                //    soDuTaiKhoanChiPhiKhac = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanChiPhiKhacID);
                //}
                //decimal laiKhac = soDuTaiKhoanDoanhThuKhac.DuCo - soDuTaiKhoanChiPhiKhac.DuNo;
                //ucDigitalNumberLaiHĐKhac.DisplayText = GeneralLibs.CommonLib.Decimal2Money(laiKhac);

                //lãi gộp trừ chi phí (lợi nhuận trước thuế)
                decimal tongChiPhi = chiPhiHoatDong + soDuTaiKhoanChiPhiSX.DuNo + tongChiKhac811_635;
                decimal loiNhuanTruocThue = laiGop + tongThuKhac711_515 - tongChiPhi;
                ucDigitalNumberLaiTruChiPhi.DisplayText = GeneralLibs.CommonLib.Decimal2Money(loiNhuanTruocThue);

                ////Lãi lỗ trước thuế
                //decimal laiLoTruocThue = loiNhuanTruocThue + laiHoatDongTaiChinh + laiKhac;
                //ucDigitalNumberLoiNhuanTruocThue.DisplayText = GeneralLibs.CommonLib.Decimal2Money(laiLoTruocThue);

                //Thuế thu nhập doanh nghiệp
                Guid taiKhoanThueThuNhapDoanhNghiepID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("821").ID;
                SoDuTaiKhoan soDuTaiKhoanThueThuNhapDoanhNghiep = new SoDuTaiKhoan();
                if (xemTuDauKyCuoi)
                {
                    soDuTaiKhoanThueThuNhapDoanhNghiep = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanThueThuNhapDoanhNghiepID);
                }
                else
                {
                    soDuTaiKhoanThueThuNhapDoanhNghiep = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanThueThuNhapDoanhNghiepID);
                }
                Guid taiKhoanThueVATID = (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("333").ID;
                SoDuTaiKhoan soDuTaiKhoanThueVAT = new SoDuTaiKhoan();
                if (xemTuDauKyCuoi)
                {
                    soDuTaiKhoanThueVAT = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanThueVATID);
                }
                else
                {
                    soDuTaiKhoanThueVAT = SoDuTaiKhoan.CalculatePhatSinhTrongKy(dtNgayBatDau.DateTime, dtNgayKetThuc.DateTime, taiKhoanThueVATID);
                }
                ucDigitalNumberThueThuNhap.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanThueThuNhapDoanhNghiep.DuNo + soDuTaiKhoanThueVAT.DuNo);

                //Lãi lỗ thực (sau thuế)
                decimal laiLoThuc = loiNhuanTruocThue - soDuTaiKhoanThueThuNhapDoanhNghiep.DuNo - soDuTaiKhoanThueVAT.DuNo;
                ucDigitalNumberLoiNhuanThuc.DisplayText = GeneralLibs.CommonLib.Decimal2Money(laiLoThuc);

                //NguonVonKinhDoanh
                Guid taiKhoanNguonVonKinhDoanhID= (Guid)DanhMucTaiKhoan.Instance.GetBySoHieu("411").ID;
                SoDuTaiKhoan soDuTaiKhoanNguonVonKinhDoanh = SoDuTaiKhoan.CalculateFromDB(dtNgayKetThuc.DateTime, taiKhoanNguonVonKinhDoanhID);
                ucDigitalNumberNguonVon.DisplayText = GeneralLibs.CommonLib.Decimal2Money(soDuTaiKhoanNguonVonKinhDoanh.DuCo);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
            }

            BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void ReIndexDB()
        {
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandTimeout = 1000 * 10;
                cmd.CommandText = string.Format("DECLARE @MyTable VARCHAR(255) \n" +
                                                "DECLARE myCursor CURSOR FOR \n" +
                                                "   SELECT table_name \n" +
                                                "   FROM information_schema.tables \n" +
                                                "   WHERE table_type = 'base table' \n" +
                                                "OPEN myCursor \n" +
                                                "FETCH NEXT FROM myCursor INTO @MyTable \n" +
                                                "WHILE @@FETCH_STATUS = 0 \n" +
                                                "BEGIN \n" +
                                                "   PRINT 'Reindexing Table:  ' + @MyTable \n" +
                                                "   DBCC DBREINDEX(@MyTable, '', 80) \n" +
                                                "   FETCH NEXT FROM myCursor INTO @MyTable \n" +
                                                "END \n" +
                                                "CLOSE myCursor \n" +
                                                "DEALLOCATE myCursor \n" +
                                                "EXEC sp_updatestats \n"
                                                );
                BasicForms.FrmProgressBar.StartShowProgress("Đang đánh lại chỉ mục cho các bảng trong CSDL để tăng tốc độ truy vấn");
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Gặp sự cố khi đánh lại chỉ mục cho các bảng trong CSDL");
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
                if (con.State == ConnectionState.Open) con.Close();
            }
        }

        private void btnSuDungBIcu_Click(object sender, EventArgs e)
        {
            if (this.ParentForm is BIMainForm)
                (this.ParentForm as BIMainForm).SuDungMauBICu();
        }
    }
}
